import axios from 'axios'
import { ElMessage, ElMessageBox } from 'element-plus'
import { useUserStore } from '../store/userStore'
import router from '@/router'


// 创建axios实例
const service = axios.create({
  baseURL: process.env.VUE_APP_BASE_API,
  timeout: 15000,
  withCredentials: true
})

// 请求拦截器
service.interceptors.request.use(
  config => {
    
    const userStore = useUserStore()
    
    // 1. 添加token
    const token = userStore.token
    if (token) {
      config.headers['Authorization'] = `Bearer ${token}`
    }
    
    // 2. 防止缓存，给get请求添加时间戳
    if (config.method === 'get') {
      config.params = {
        ...config.params,
        _t: Date.now()
      }
    }
    
    // 3. 处理请求数据
    if (config.method === 'post' || config.method === 'put') {
      // 数据转换，根据后端要求转换数据格式
      // config.data = qs.stringify(config.data)
    }
    
    // 4. 设置请求头
    config.headers['Content-Type'] = config.headers['Content-Type'] || 'application/json'
    
    // 5. 国际化处理
    config.headers['Accept-Language'] = localStorage.getItem('language') || 'zh-CN'
    
    return config
  },
  error => {
      console.error('请求配置错误:', error)  // 添加日志记录
    ElMessage.error('请求配置错误')
    return Promise.reject(error)
  }
)

// 响应拦截器
service.interceptors.response.use(
  response => {
    const res = response.data
    
    // 1. 处理自定义状态码
    if (res.code !== 200) {
      // 401: Token过期或未登录
      if (res.code === 401) {
        const userStore = useUserStore()
        
        ElMessageBox.confirm(
          '登录状态已过期，您可以继续留在该页面，或者重新登录',
          '系统提示',
          {
            confirmButtonText: '重新登录',
            cancelButtonText: '取消',
            type: 'warning'
          }
        ).then(() => {
          userStore.logout()
          router.push('/login')
        })
        
        return Promise.reject(new Error('登录状态已过期'))
      }
      
      // 403: 权限不足
      if (res.code === 403) {
        router.push('/403')
        return Promise.reject(new Error('权限不足'))
      }
      
      // 500: 服务器错误
      if (res.code === 500) {
        ElMessage.error(res.message || '服务器错误')
        return Promise.reject(new Error(res.message || '服务器错误'))
      }
      
      // 其他错误
      ElMessage.error(res.message || '未知错误')
      return Promise.reject(new Error(res.message || '未知错误'))
    }
    
    // 2. 处理文件下载
    const contentType = response.headers['content-type']
    if (contentType && contentType.includes('application/octet-stream')) {
      return response
    }
    
    return res
  },
  error => {
    
    // 1. 处理网络错误
    if (!error.response) {
      ElMessage.error('网络错误，请检查网络连接')
      return Promise.reject(error)
    }
    
    // 2. 处理HTTP状态码
    const status = error.response.status
    switch (status) {
      case 400:
        ElMessage.error('请求错误')
        break
      case 401:
        ElMessage.error('未授权，请重新登录')
        // 清除用户信息并跳转登录页
        const userStore = useUserStore()
        userStore.logout()
        router.push('/login')
        break
      case 403:
        ElMessage.error('拒绝访问')
        break
      case 404:
        ElMessage.error('请求地址不存在')
        break
      case 408:
        ElMessage.error('请求超时')
        break
      case 500:
        ElMessage.error('服务器内部错误')
        break
      case 501:
        ElMessage.error('服务未实现')
        break
      case 502:
        ElMessage.error('网关错误')
        break
      case 503:
        ElMessage.error('服务不可用')
        break
      case 504:
        ElMessage.error('网关超时')
        break
      case 505:
        ElMessage.error('HTTP版本不受支持')
        break
      default:
        ElMessage.error('系统未知错误')
    }
    
    return Promise.reject(error)
  }
)

export default service